package com.xneure.utils;

import java.util.ArrayList;
import java.util.List;
import com.xneure.utils.bean.Caller;

/**
 * <p>
 * 堆栈工具
 * </p>
 * <p>
 * Copyright: 版权所有<br>
 *
 * @author 张军
 * @version 2016年4月17日
 */
public class StackUtil{
	/**
	 * 获取指定位置的堆栈信息
	 * 
	 * @param index
	 * @return Caller[]
	 */
	public static Caller[] getCaller(int index){
		return getCaller(index,0);
	}

	/**
	 * 获取指定范围内的堆栈信息
	 * 
	 * @param index
	 * @param len
	 * @return Caller[]
	 */
	public static Caller[] getCaller(int index,int len){
		StackTraceElement[] stack = Thread.currentThread().getStackTrace();
		index += 2;
		int l = 0;
		int length = stack.length;
		List<Caller> list = new ArrayList<Caller>(length - index);
		for(int i = index;i < length;i++){
			list.add(new Caller(stack[i]));
			if(len > 0){
				if(++l >= len){
					break;
				}
			}
		}
		return list.toArray(new Caller[list.size()]);
	}

	public static Caller[] getCaller(String... cls){
		StackTraceElement[] stack = Thread.currentThread().getStackTrace();
		int index = -1;
		int length = stack.length;
		List<Caller> list = new ArrayList<Caller>(length);
		for(int i = length - 1;i > 0;i--){
			for(String c:cls){
				if(stack[i].getClassName().endsWith(c)){
					index = i + 1;
					break;
				}
			}
			if(index > -1){
				break;
			}
		}
		int i = index;
		for(;i < length;i++){
			list.add(new Caller(stack[i]));
		}
		if(list.size() > 0){
			return list.toArray(new Caller[list.size()]);
		}else{
			return null;
		}
	}

	/**
	 * 第一个堆栈信息
	 * 
	 * @return Caller
	 */
	public static Caller getFirstCaller(){
		return getCaller(1,1)[0];
	}
}
